Generalidades de los Sistemas
Expertos
Un avance firme y verdadero de la inteligencia
artificial lo constituyen sin dudas los sistemas
expertos. Estos pueden incorporar miles de reglas. A una
persona le
causaría trauma realizar una búsqueda de reglas
posibles para completar un problema y a la vez hacer que
concuerden estas con la posible solución, mientras sigue
en un papel el mejor de los caminos en un árbol de
búsqueda de soluciones
.
Los sistemas expertos realizan amablemente esta tarea;
mientras que la persona responde a las preguntas formuladas por
el sistema experto,
este busca recorriendo las ramas más interesantes del
árbol, hasta dar con la respuesta afín al problema,
o en su falta, la más parecida esta. Los sistemas expertos
tienen la ventaja frente a otros tipos de programas de
Inteligencia
Artificial, de proporcionar gran flexisivilidad a la hora de
incorporar nuevos conocimientos. Para ello solo tenemos que
introducir la nueva regla que deseemos hacer constar y…ya
está, sin necesidad de cambiar el funcionamiento propio
del programa. Los
sistemas expertos son "autoexplicativos", al contrario que en los
programas convencionales, en los que el
conocimiento como tal está encriptado junto al propio
programa en forma de lenguaje de
ordenador. Los expertos de I.A. dicen que los sistemas expertos
tienen un conocimiento
declarativo, mientras que en los demás programas es
procedural.
El Sistema Experto más adecuado para la
Generación inteligente
Bajo la plataforma .NET corre de manera silenciosa pero
veloz :ExpertCoder, un conjunto de herramientas
para escribir generadores de código.
Estas herramientas no son generadores de generadores; sino que se
apoya en un conjunto de librerías para escribir los
generadores.
Existen otras alternativas más avanzadas, como
por ejemplo utilizar plantillas XSLT para transformar documentos
XML en
código fuente; con estas alternativas se gana en claridad,
ya que el código del generador (la plantilla) se parece
mucho al código generado; sin embargo exponen sus
desventajas a la hora de agregarle inteligencia al generador, ya
que el conjunto de herramientas y librerías accesibles
desde una plantilla es bastante reducido.
El propósito de este proyecto es
construir un conjunto de herramientas que provean al
desarrollador de generadores de código lo mejor de ambos
mundos:
- La claridad que aporta el uso de plantillas para la
generación de código. - La potencia de
la plataforma .NET, junto a su enorme librería de
clases, brinda un gran poder de
expresión al desarrollador.
Adicionalmente, al estar basado en los principios de los
sistemas expertos, los generadores resultantes son
fácilmente extensibles, modulares y su estructura es
más declarativa que imperativa.
¿Qué es lo que más nos interesa en
la entrada del generador?
En un ambiente de
generación de código, no nos interesan la
posición ni el tamaño de los cuadros, ni tampoco el
grosor ni color de las
líneas u otros componentes del dibujo
grafico; nos interesan los conceptos que más profundamente
representan estas imágenes.
El conjunto de estos conceptos representados es lo que llamamos
Modelo, y es en definitiva el diseño
que el autor del diagrama quiso
representar gráficamente. Esto es lo que se convierte en
una parte importante de la materia prima
de nuestro sistema generador.
Veamos entonces el funcionamiento de este poderoso
Sistema Experto
La idea básica es crear un sistema experto,
escribiendo un conjunto de reglas y especificando las distintas
precedencias entre ellas. Estas reglas son evaluadas por un
motor de
ejecución, quien determina en base a las precedencias y al
estado de
activación de cada regla cual ejecutar.
El motor de ejecución provee un entorno, donde
hay información proveniente de tres fuentes:
- Parámetros: estos se encuentran almacenados en
ficheros de configuración. - Modelo de entrada: es el modelo que
se quiere convertir. - Conocimiento deducido: el mismo sistema experto puede
modificar su memoria activa.
De esta manera se puede implementar un mecanismo de interacción indirecto entre
reglas.
El entorno del motor mantiene referencias a:
- El modelo de entrada.
- El elemento actual del modelo de entrada.
- El modelo de salida.
- El elemento actual del modelo de salida.
Un generador típico estará compuesto por
dos tipos de reglas: reglas de navegación y reglas de
producción. Las reglas de navegación
se activan ante la presencia de un determinado tipo de elemento
en la entrada, y procede a "navegar" las relaciones de dicho
elemento, cambiando el elemento actual del modelo de entrada. Las
reglas de producción, al activarse ante un elemento en la
entrada ( y tal vez también cierto tipo de elemento a la
salida), aplican un algoritmo
escrito por el desarrollador para generar nodos a la salida
utilizando la información actual que se encuentra en la
entrada y la memoria
activa.
Una manera de hacer bien
las cosas
La forma de trabajo,
consiste en crear un sistema experto escribiendo un conjunto de
reglas y especificando las distintas precedencias entre ellas.
Estas reglas son evaluadas por un motor de ejecución (del
Sistema Experto), quien determina cual ejecutar en base a las
precedencias y al estado de activación de cada regla. Esto
resuelve la problemática planteada. Aunque la forma de
hacerlo esta planteada en lo adelante ninguna herramienta
individual ha logrado hacer uso eficiente de estos recursos que
provee la plataforma .NET
El motor de ejecución provee un entorno, donde
hay información proveniente de tres fuentes:
- Parámetros: estos se encuentran almacenados en
ficheros de configuración. - Modelo de entrada: es el modelo que se quiere
convertir. - Conocimiento deducido: el mismo sistema experto puede
modificar su memoria activa. De esta manera se puede
implementar un mecanismo de interacción indirecto entre
reglas.
El entorno del motor mantiene referencias a los
siguientes elementos:
- El modelo de entrada.
- El elemento actual del modelo de entrada.
- El modelo de salida.
- El elemento actual del modelo de salida.
Un generador típico estará compuesto por
dos tipos de reglas: reglas de navegación y reglas de
producción.
Las reglas de navegación se activan ante la
presencia de un determinado tipo de elemento en la entrada, y
procede a "navegar" las relaciones de dicho elemento, cambiando
el elemento actual del modelo de entrada.
Las reglas de producción, al activarse ante un
elemento en la entrada (y tal vez también ante cierto tipo
de elemento a la salida), aplican un algoritmo escrito por el
desarrollador para generar nodos a la salida utilizando la
información actual que se encuentra en la entrada y la
memoria activa.
Usando plantillas
Una plantilla es un documento de texto plano,
donde pueden escribirse algunos marcadores especiales. Estos
marcadores pueden luego ser reemplazados por valores
durante la ejecución de un programa. No hay un formato
predefinido para los marcadores; cada programador puede escoger
el esquema que más le guste o que más le
convenga.
Este documento, puede ser tratado por el sistema experto
de manera encapsulada haciendo tratamiento de ficheros que
agilizan el trabajo del
sistema experto, pues permiten agregar reglas que estan
previamente delimitadas.
La librería para manipular plantillas es
ExpertCoder.Templates.dll.
Lo novedoso aqui es que dentro de las plantillas se
pueden crear marcadores,un marcador puede reemplazarse por una
cadena de caracteres cualquiera, sin importar de donde se obtuvo
dicha cadena. Por lo tanto, el valor de un
marcador podría obtenerse a partir de otra plantilla.
Aprovechando esto es posible crear árboles
de plantillas, o sea, estructuras
jerárquicas donde una plantilla contiene a otras
plantillas.
Buscando una arquitectura que
soporte los propósitos
Cada cosa planteada anteriormente se convierte para
muchos en un reto, podemos encarar la tarea de escribir un
generador de código que genere a partir de un modelo un
sistema informático completo, incluyendo los mecanismos
para su compilación. Lo más eficiente en este caso
es escribir varios generadores, uno por cada capa.
La arquitectura del código generado estará
pensada de manera tal que todas sus piezas calcen a la
perfección, dejando lugar para que los programadores
añadan funcionalidad o restrinjan el comportamiento
del sistema. Deberán minimizarse, siempre que sea posible,
los casos donde el generador cree sólo la versión
inicial de un fichero que el programador pueda modificar; las
interacciones entre el código generado y el código
escrito a mano podrán ser mediante mecanimos de herencia o
composición.
Como ya se mencionó, es altamente probable que el
código generado haga uso de librerías escritas por
los mismos desarrolladores del generador.
No es el fin del
pensamiento
informático
La generación de código es sólo una
solución pragmática a la situación actual.
No implica abandonar todo pensamiento crítico, toda
esperanza de mejora en la creación de sofware. Creo que
vamos por buen camino: tenemos arquitectura, patrones, vamos
conociendo cada vez más, cómo generar software de calidad. Estamos,
creo, en una etapa ingeniosa de nuestra disciplina:
estamos ordenando conocimientos, clasificando datos, comenzando
a darnos cuenta de cuáles son los esquemas, relaciones,
problemas
esenciales. Vamos por la línea de Turing.
Conclusiones
Muchos son los caminos mediante los cuales los
desarrolladores pueden simplificar su trabajo y disminuir el
valor de la poderosa variable tiempo en los
procesos de
desarrollo del
software. Utilizar eficazmente estos recursos brindados por .NET
posibilita una abstracción en la programación necesaria para las técnicas
actuales de desarrollo.
El diseño de ste tipo de programas no puede dejar
de cumplir estos requisitos que garantizan lo novedoso, lo que lo
acerca al mundo d el ainteligenmcia artificial:
Aprender de la experiencia y aplicar el conocimiento
adquirido a nuevas situaciones.Hacer una determinación de
lo que es importante. Lograr hacer software que almacenan
conocimientos y haga inferencias.
Bibliografía
Russell, Russell, Stuart. Norvig, Peter (1996),
"Inteligencia Artificial. Un enfoque moderno". Editorial
Prentice Hall. 1996.
Giarritano, J. (2001), Sistemas expertos,
principios y programación, Internacional
Simons, G. (1985), Expert Systems and mycros,
Manchester National Computing Centre
Booch,Grady(1999), UML in Action,
Comunication of the ACM
Coleman Derek(1997) , UML:The Language of blueprints
for Software
http://www.aircenter.net
http://www.codegeneration.net/
Ayuda de Visual Estudio.NET
Biografía del autor
Lázaro Campoalegre Vera, estudiante de Ultimo
año de Ingeniería en Ciencias
Informáticas, Facultad de Entornos Virtuales, Universidad de
las Ciencias Informáticas (UCI), Ciudad de la Habana,
Cuba.
Lazaro Campoalegre Vera
Facultad de Entornos Virtuales
Universidad de las Ciencias
Informáticas
Ciudad de la Habana,Cuba, 22 de octubre de
2007.
Página anterior | Volver al principio del trabajo | Página siguiente |